#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

#define High 15  // 游戏画面尺寸
#define Width 35
#define EnemyNum 5 // 敌机个数

// 全局变量
int food_x,food_y;//food
int position_x, position_y; // 飞机位置
int enemy_x[EnemyNum], enemy_y[EnemyNum];  // 敌机位置
int canvas[High][Width] = { 0 }; // 二维数组存储游戏画布中对应的元素
						// 0为空格，-1为边框#，1为蛇头@|，大于1 的输出蛇身*-2食物F
int moveDirection;           //1234表示上下左右
int score;

void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };  // 第二个值为0表示隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}


void gotoxy(int x, int y)  //光标移动到(x,y)位置
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}

void startup() // 数据初始化
{
	int i,j;
	//边框数值
	for(i=0;i<High;i++)
    {
        canvas[i][0]=-1;
        canvas[i][Width-1]=-1;
    }
    for(j=0;j<Width;j++)
    {
        canvas[0][j]=-1;
        canvas[High-1][j]=-1;
    }
    //初始化蛇头蛇身
    canvas[High/2][Width/2]=1;
    for(i=1;i<=4;i++)
        canvas[High/2][Width/2-i]=i+1;
    food_x=rand()%(High-5)+2;
    food_y=rand()%(Width-5)+2;
    canvas[food_x][food_y]=-2;
        moveDirection=4;
	HideCursor();
}


void moveSnakeByDirection()
{
    int i,j;
    int max=0;
    int oldTail_i,oldTail_j;//旧蛇尾
    int oldHead_i,oldHead_j;
    for(i=1;i<High-1;i++)
        for(j=1;j<Width-1;j++)
    {

        if(canvas[i][j]>0)
        {
            //对所有大于0的元素+1
            canvas[i][j]++;

            //求最大值
            if(max<canvas[i][j])
            {
                max=canvas[i][j];
                oldTail_i=i;
                oldTail_j=j;
            }

            if(canvas[i][j]==2)
            {
                oldHead_i=i;
                oldHead_j=j;
            }
        }
    }


    int newHead_i,newHead_j;
    if (moveDirection==1)
    {

        newHead_i=oldHead_i-1;
        newHead_j=oldHead_j;
    }
    if (moveDirection==2){

        newHead_i=oldHead_i+1;
        newHead_j=oldHead_j;
    }
    if (moveDirection==3){

        newHead_i=oldHead_i;
        newHead_j=oldHead_j-1;
    }
    if (moveDirection==4){

        newHead_i=oldHead_i;
        newHead_j=oldHead_j+1;
    }
    //判断吃食物
    if(canvas[newHead_i][newHead_j]==-2)
    {
        canvas[food_x][food_y]=0;
        food_x=rand()%(High-5)+2;
        food_y=rand()%(Width-5)+2;
        canvas[food_x][food_y]=-2;
    }
    else
    {
        //最大值所在元素归零
        canvas[oldTail_i][oldTail_j]=0;
    }


    //判断小蛇蛇头撞边框或自身

    if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1)
    {
        printf("游戏失败\n");
        exit(0);
    }

    else
    {
        canvas[newHead_i][newHead_j]=1;
    }
    Sleep(50);
}

void show()  // 显示画面
{
	gotoxy(0, 0);  // 光标移动到原点位置，以下重画清屏
	int i, j;
	for (i = 0; i < High; i++)
	{
		for (j = 0; j < Width; j++)
		{
			if (canvas[i][j] == 0)
				printf(" ");   //   输出空格
			else if (canvas[i][j] == -1)
				printf("#");   //   输出边框#
			else if (canvas[i][j] == 1)
				printf("@");   //   输出蛇头@
			else if (canvas[i][j] > 1)
				printf("*");   //  输出蛇身*
            else if (canvas[i][j] ==-2)
				printf("F");   //  输出F
		}
		printf("\n");
	}
	printf("得分：%d\n", score);
	Sleep(20);
}

void updateWithoutInput()  // 与用户输入无关的更新
{
	moveSnakeByDirection();
}

void updateWithInput()  // 与用户输入有关的更新
{
	char input;
	if (_kbhit())  // 判断是否有输入
	{
		input = _getch();  // 根据用户的不同输入来移动，不必输入回车
		if (input == 'a' )
		{
			moveDirection=3;
		}
		else if (input == 'd')
		{
			moveDirection=4;
		}
		else if (input == 'w')
		{
			moveDirection=1;
		}
		else if (input == 's')
		{
			moveDirection=2;
		}

		}
	}


int main()
{
	startup();  // 数据初始化
	while (1)  // 游戏循环执行
	{
		show();  // 显示画面
		updateWithoutInput();  // 与用户输入无关的更新
		updateWithInput();  // 与用户输入有关的更新
	}
	return 0;
}


